home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 106_01 / bspat1_4.doc < prev    next >
Text File  |  1980-07-08  |  7KB  |  258 lines

  1.     ; TITLE 'Skeleton BIOS for CP/M Version 1.4 w/ Back Space Patch'
  2.     ;
  3. MSIZE    EQU    48    ; SYSTEM MEMORY SIZE IN DECIMAL K BYTES
  4.     ;
  5.     ;
  6.     ; Features added or modified by H.R.Moran 10/2/72..10/15/79
  7.     ;
  8.     ;    The BDOS is patched at both cold and warm boot
  9.     ;    to handle a backspace for a CRT properly when
  10.     ;    the BDOS function read console buffered is used.
  11.     ;    This does not intefere with the operation of anyone
  12.     ;    else's (e.g. MICROSOFT,XITAN,WPDAISY) trapping of
  13.     ;    the backspace handling. This feature is conditionally
  14.     ;    assembled in under control of the CRT switch.
  15.     ;
  16.     ;    This method has one drawback. MOVCPM will not
  17.     ;    work properly under a system with this patch
  18.     ;    installed, it dies after indicating synchronization
  19.     ;    error. Therefore, you must keep at least one
  20.     ;    copy of an unpatched system around to generate
  21.     ;    new system sizes.
  22.     ;
  23.     ;
  24.     ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  25.     ; !                              !
  26.     ; !  THE LABEL 'BDOS' IN THIS EXAMPLE IS THE PLACE    !
  27.     ; !  YOU JUMP TO IN TURNING CONTROL OVER TO THE CCP   !
  28.     ; !  NOT THE BEGINNING OF CP/M AS IS THE CASE IN      !
  29.     ; !  SOME OTHER EXAMPLE BIOS'S. THAT IS THE 'BDOS'    !
  30.     ; !  IN THIS CODE IS 6 GREATER THAN THE BEGINNING     !
  31.     ; !  OF CP/M.                          !
  32.     ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  33.     ;
  34.     ; * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  35.     ; *                            *
  36.     ; *    SYMBOL DEFINITIONS AND EQUATES            *
  37.     ; *                            *
  38.     ; * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  39.  
  40.  
  41. TRUE    EQU    0FFFFH
  42. FALSE    EQU    NOT TRUE
  43.     ;
  44.     ;
  45. BELL    EQU    7        ;ring-a-ding-ding
  46. BS    EQU    8        ;BACKSPACE
  47. TAB    EQU    9        ;TAB
  48. LF    EQU    0AH        ;LINEFEED
  49. CR    EQU    0DH        ;CARRIAGE RETURN
  50.     ;
  51.     ;
  52. CRT        EQU    TRUE    ; CONTROLS BACKSPACE/DELETE
  53.                 ;  (IF TRUE, RUBOUT CAUSES BACKSPACE
  54.                 ;   IF FALSE, RUBOUT CAUSES ECHO.)
  55.  
  56. PATCH    EQU    MSIZE*1024-2*256    ;START OF THE CBIOS
  57.     ;
  58.     ORG    PATCH        ;ORIGIN OF THIS PROGRAM
  59.     ;
  60. CBASE    EQU    (MSIZE-16)*1024    ;BIAS FOR SYSTEMS LARGER THAN 16K
  61. CPMB    EQU    CBASE+2700H    ;BASE OF CP/M (= BASE OF CCP)
  62. CCP    EQU    CPMB        ;alias
  63. BDOS    EQU    CBASE+2F06H    ;BASE OF RESIDENT PORTION OF CP/M
  64. CPML    EQU    $-CPMB        ;LENGTH OF THE CP/M SYSTEM IN BYTES
  65. NSECTS    EQU    CPML/128    ;NO. OF SECTS TO LOAD ON WBOOT
  66.     ;
  67.     ;
  68.     ; *    JUMP VECTOR FOR INDIVIDUAL SUBROUTINES
  69.     ;
  70.     JMP    BOOT        ;COLD START
  71. WBOOTE:
  72.     JMP    WBOOT        ;WARM START
  73.     JMP    CONST        ;CONSOLE STATUS
  74.     JMP    CONIN        ;CONSOLE CHARACTER IN
  75.     JMP    CONOUT        ;CONSOLE CHARACTER OUT
  76.     JMP    LIST        ;LIST CHARACTER OUT
  77.     JMP    PUNCH        ;PUNCH CHARACTER OUT
  78.     JMP    READER        ;READER CHARACTER OUT
  79.     JMP    HOME        ;MOVE HEAD TO HOME POSITION
  80.     JMP    SELDSK        ;SELECT DISK
  81.     JMP    SETTRK        ;SET TRACK NUMBER
  82.     JMP    SETSEC        ;SET SECTOR NUMBER
  83.     JMP    SETDMA        ;SET DMA ADDRESS
  84.     JMP    READ        ;READ DISK
  85.     JMP    WRITE        ;WRITE DISK
  86.     ;
  87.  
  88. BOOT:
  89.     LXI    SP, 0100H    ; FIRST SET UP STACK POINTER
  90.     ;
  91.     ; PERFORM I/O INITIALIZATION HERE, IF NESSECARY
  92.     ;
  93.     LXI    H, SMSG        ; PRINT SIGNON MESSAGE
  94.     CALL    PMSG
  95.     ;
  96.     XRA    A
  97.     STA    IOBYTE        ; CLEAR THE IOBYTE
  98.     STA    CDISK        ; ALSO SET THE DEFAULT DISK TO A:
  99.     ;
  100.     MVI    A,031H        ; SELECT DRIVE A: FOR FUTURE OPERATIONS
  101.     STA    SELECT
  102.     ;
  103.     JMP    GOCPM        ;INITIALIZE AND GO TO CP/M
  104.     ;
  105. WBOOT:                ; RELOAD THE OPERATING SYSTEM FROM DISK
  106.     LXI    SP,0100H    ; SET STACK POINTER FOR BOOTSTRAP
  107.     MVI    C,0        ;SELECT DISK 0
  108.     CALL    SELDSK
  109.     CALL    HOME        ;GO TO TRACK 00
  110.     MVI    B,NSECTS    ;B COUNTS THE NUMBER OF SECTORS TO LOAD
  111.     MVI    C,0        ;C HAS THE CURRENT TRACK NUMBER
  112.     MVI    D,2        ;D HAS THE NEXT SECTOR TO READ
  113.     ;
  114.     ; *    NOTE THAT WE BEGIN BY READING TRACK 0, SECTOR 2 SINCE SECTOR 1    ;
  115.     ; *    CONTAINS THE COLD START LOADER, WHICH IS SKIPPED IN A WBOOT
  116.     ;
  117.     LXI    H,CPMB    ;BASE OF CP/M (INITIAL LOAD POINT)
  118.     ;
  119.     ; *    END OF LOAD OPERATION, SET PARAMETERS AND GO TO CP/M
  120.     ;
  121. GOCPM:
  122.     ;
  123.     ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  124.     ;
  125.     ; THIS IS WHERE THE PATCH IS INSTALLED IN THE BDOS
  126.     ; UNDER CONDITIONAL ASSEMBLY SWITCH 'CRT'
  127.     ;
  128.     ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  129.     ;
  130.     ;
  131.     IF    CRT
  132.                 ;PATCH BDOS TO GOTO 'MYBS' WHEN
  133.     LXI    H,MYBS        ;RUBOUT ENCOUNTERED AND BUFFER
  134.     SHLD    BDOS+189H    ;NOT EMPTY.
  135.     ENDIF
  136.     ;
  137.     ; **************************************************
  138.     ; 
  139.     ; THE REST OF THIS IS NORMAL CP/M STUFF
  140.     ;
  141.     ; **************************************************
  142.     ;
  143.     MVI    A,(JMP)
  144.     STA    0    ;FOR JMP TO WBOOT
  145.     LXI    H,WBOOTE    ;WBOOT ENTRY POINT
  146.     SHLD    1    ;SET ADDRESS FIELD FOR JMP AT 0
  147.     ;
  148.     STA    5    ;FOR JMP TO BDOS
  149.     LXI    H,BDOS    ;BDOS ENTRY POINT
  150.     SHLD    6    ;ADDRESS FIELD OF JUMP AT 5 TO BDOS
  151.     ;
  152.     LXI    B,80H    ;DEFAULT DMA ADDRESS IS 80H
  153.     CALL    SETDMA
  154.     ;
  155.     EI        ;ENABLE THE INTERRUPT SYSTEM
  156.     ;        ;  ON GENERAL PRINCIPLES
  157.     LDA    CDISK    ;GET CURRENT DISK NUMBER
  158.     MOV    C,A    ;SEND TO THE CCP
  159.     JMP    CPMB    ;Give control to CCP
  160.     ;
  161. CONST:            ;CONSOLE STATUS, RETURN 0FFH IF CHARACTER READY,
  162. CONIN:            ;CONSOLE CHARACTER INTO REGISTER A
  163. CONOUT:            ;CONSOLE CHARACTER OUTPUT FROM REGISTER C
  164. LIST:            ;LIST CHARACTER FROM REGISTER C
  165. PUNCH:            ;PUNCH CHARACTER FROM REGISTER C
  166. READER:            ;READ CHARACTER INTO REGISTER A FROM READER DEVICE
  167. SELDSK:            ;SELECT A DISK.
  168. HOME:            ;SEEK TO TRACK ZERO.
  169. SETTRK:            ;SELECT A TRACK
  170. SETSEC:            ;SELECT A SECTOR
  171. SETDMA:            ;SET THE DATA TRANSFER AREA ADDRESS
  172. READ:            ;READ A SECTOR
  173. WRITE:            ;WRITE A SECTOR
  174.     ;
  175. SMSG:    DB    CR, LF
  176.     DB    MSIZE/10+'0',MSIZE MOD 10 + '0'
  177.     DB    'K CP/M VERSION 1.4 w/bs & motor ctrl', CR,LF
  178.     DB    CR,LF,0
  179.     ;
  180. TRK:    DB    0        ;CURRENT TRACK NUMBER.
  181. SECT:    DB    0        ;CURRENT SECTOR NUMBER.
  182. DMAADD:    DW    0        ;DISK TRANSFER ADDRESS.
  183. DISKNO:    DB    0        ;CURRENT DISK NUMBER.
  184.     ;
  185.     ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  186.     ;
  187.     ;    BACKSPACE PATCH STUFF
  188.     ;
  189.     ; CALLED BY THE BDOS WHEN A RUBOUT IS RECOGNIZED
  190.     ; AND THE LINE BUFFER IS NOT ALREADY EMPTY.
  191.     ;
  192.     ;
  193.     ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  194.     ;
  195.     ; WHEN BACKING UP OVER NORMAL CHARS SEND BS,' ',BS TO CRT
  196.     ; WHEN BACKING UP OVER CONTROL CHARS, SEND 2 SUCH SEQUENCES
  197.     ; TO BACKUP OVER THE '^' SHOWN WITH THE CONTROL CHAR
  198.     ; WHEN BACKING UP OVER TABS OR LF'S, HANDLE AS CONTROL R
  199.     ;
  200.     ;note:    IF YOU WISH THIS TO BE DONE CONDITIONALLY
  201.     ;    DEPENDING ON WHETHER THE CTRL-P ECHO TO PRINTER
  202.     ;    IS IN EFFECT, THE FLAG FOR CTRL-P IS AT
  203.     ;    BDOS+300H AND IF THE LSBIT IS A 1 THEN ECHO
  204.     ;    TO PRINTER IS ENABLED.
  205.     ;
  206.     ;    THE NORMAL BACKSPACE HANDLER IS AT BDOS+2E0H
  207.     ;    AND YOU ACCESS IT BY JUMPING TO IT, NOT CALLING
  208.     ;    SINCE THE CALL HAS ALREADY BEEN MADE TO THIS
  209.     ;    ROUTINE.
  210.     ;
  211.     ;ex:    MYBS:    PUSH    B        ;save BC
  212.     ;        MOV    C,A        ;save char being deleted
  213.     ;        LDA    BDOS+2E0H
  214.     ;        RAR            ;CY = ctrl-p flag
  215.     ;        MOV    A,C        ;restore char being deleted
  216.     ;        POP    B        ;restore BC
  217.     ;        JC    BDOS+2E0H    ;Is hardcopy on ?
  218.     ;                    ;No
  219.     ;        fall thru to existing MYBS code
  220.     ;
  221.     ;
  222.     IF    CRT
  223. MYBS:    PUSH    H
  224.     LXI    H,BDOS+16DH
  225.     XTHL
  226.     CALL    BDOS+0CDH
  227.     JNC    NOCTRL        ;IS IT A CTRL CHAR EXCLUDING CR,LF,TAB ?
  228.     CALL    BAKUP        ;YES
  229.     ;
  230. BAKUP:    PUSH    B        ;SEND THE BACKUP SEQUENCE BS,' ',BS
  231.     MVI    C,BS
  232.     CALL    CONOUT
  233.     MVI    C,' '
  234.     CALL    CONOUT
  235.     MVI    C,BS
  236.     CALL    CONOUT
  237.     POP    B
  238.     PUSH    H
  239.     LXI    H,BDOS+1FFH    ;DECREMENT BDOS'S COLUMN COUNTER
  240.     DCR    M
  241.     POP    H
  242.     RET
  243.     ;
  244. NOCTRL:    CPI    TAB
  245.     JZ    DOCTRLR    ;ARE WE BACKING OVER A TAB ?
  246.     CPI    LF    ;NO
  247.     JZ    DOCTRLR    ;ARE WE BACKING OVER A LF ?
  248.     JMP    BAKUP    ;NO, SEND 1 BACKUP SEQUENCE
  249.     ;
  250. DOCTRLR:
  251.     XTHL
  252.     LXI    H,BDOS+1BFH    ;CONTROL-R HANDLER
  253.     XTHL
  254.     RET
  255.     ENDIF
  256.     ;
  257.     END
  258.